package com.alex.util.path;

import com.alex.util.date.DateUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.util.AntPathMatcher;
import org.springframework.util.PathMatcher;

import java.util.Calendar;
import java.util.Set;

/**
 * 路径工具类
 *
 * @author alex
 */
public class PathUtils {

    private static PathMatcher pathMatcher = new AntPathMatcher();

    /**
     * 路径匹配
     *
     * @param lookupPath
     * @param excludes
     * @return <p>
     * author: ShenWei<br>
     * create at 2015年5月19日 下午12:23:59
     */
    public static boolean matches(String lookupPath, Set<String> excludes) {
        if (excludes != null) {
            for (String pattern : excludes) {
                if (pathMatcher.match(pattern, lookupPath)) {
                    return true;
                }
            }
            return false;
        } else {
            return true;
        }
    }

    /**
     * 拼接路径
     *
     * @param paths
     * @return <p>
     * author: ShenWei<br>
     * create at 2015年5月19日 下午12:31:33 eg
     *
     * <pre>
     * concat('a','b','c') = /a/b/c;
     * concat('a/','/b','c') = /a/b/c;
     * </pre>
     */
    public static String concat(String... paths) {
        StringBuilder sb = new StringBuilder(128);
        for (String path : paths) {
            if (StringUtils.isNotBlank(path)) {
                if (!StringUtils.startsWith(path, "/") && !StringUtils.contains(path, ":")) {
                    sb.append("/");
                }
                sb.append(path);
                char last = sb.charAt(sb.length() - 1);
                if (StringUtils.equals("/", String.valueOf(last))) {
                    sb.deleteCharAt(sb.length() - 1);
                }
            }
        }
        return sb.toString();
    }

    /**
     * 路径约定，所有文件夹路径末尾都要加"/",那么在路径相加的时候，就不会出现没有"/"而字符串直接相加的情况
     * 路径相加都调用此方法，消除"//"即可
     *
     * @param paths
     * @return <p>
     * author: xyy
     * create at 2015年5月22日 上午11:10:49
     */
    public static String concatDeleteRepeat(String... paths) {
        StringBuilder sb = new StringBuilder(128);
        for (String path : paths) {
            if (StringUtils.isNotBlank(path)) {
                if (path.lastIndexOf("/") + 1 != path.length()) {
                    sb.append(path).append("/");
                } else {
                    sb.append(path);
                }
            }
        }
        String result = sb.toString();
        result = result.replace("//", "/");
        result = result.substring(0, result.length() - 1);
        return result;
    }

    /**
     * 获取阿里云存储文件名
     * 目录结构:文件夹名称/年/月/日
     *
     * @param folderName
     * @param randomKey
     */
    public static String getOssStoreFileName(String folderName, String randomKey, String suffix) {
        Calendar now = DateUtils.getCurrentCalendar();
        StringBuffer sb = new StringBuffer();
        sb.append(folderName).append("/").append(now.get(Calendar.YEAR)).append("/")
                .append(now.get(Calendar.MONTH)).append("/").append(now.get(Calendar.DAY_OF_MONTH))
                .append("/").append(randomKey).append("_").append(System.currentTimeMillis()).append(suffix);
        return sb.toString();
    }
}